package com.ruoyi.web.community;

/**
 * @author yjl03
 * @since 2025-09-01 星期一 15:41:06
 */

import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.framework.web.service.TokenService;
import com.ruoyi.web.community.service.FaceRecognitionService;
import lombok.Data;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Map;

// FaceAuthController.java
@RestController
@RequestMapping("/face")
public class FaceAuthController {

    // 注入人脸识别服务和Token服务（Ruoyi自带Token生成工具）
    private final FaceRecognitionService faceService;
    private final TokenService tokenService;

    // 构造器注入（Spring推荐，无需@Autowired）
    public FaceAuthController(FaceRecognitionService faceService, TokenService tokenService) {
        this.faceService = faceService;
        this.tokenService = tokenService;
    }

    /**
     * 人脸注册接口
     * @param request 注册请求（包含用户名、手机号、Base64人脸图片）
     * @return 注册结果（含用户ID）
     */
    @PostMapping("/register")
    public AjaxResult registerFace(@RequestBody FaceRegisterRequest request) {
        try {
            // 调用人脸注册服务（需后续实现FaceRecognitionService）
            String userId = faceService.registerFace(
                    request.getUsername(),
                    request.getPhone(),
                    request.getFaceImage()
            );

            // 用Ruoyi工具类创建Map（兼容JDK 8，避免Map.of()报错）
            Map<String, String> resultMap = CollectionUtils.newHashMap();
            resultMap.put("userId", userId); // 返回注册生成的用户ID

            return AjaxResult.success("人脸注册成功", resultMap);
        } catch (Exception e) {
            // 捕获异常并返回友好提示（建议打印日志便于排查）
            return AjaxResult.error("人脸注册失败: " + e.getMessage());
        }
    }

    /**
     * 人脸登录接口
     * @param request 登录请求（含Base64人脸图片）
     * @return 登录结果（含用户信息和JWT Token）
     */
    @PostMapping("/login")
    public AjaxResult loginWithFace(@RequestBody FaceLoginRequest request) {
        try {
            // 调用人脸登录服务，获取匹配的用户信息
            SysUser user = faceService.loginWithFace(request.getFaceImage());

            // 构建 Ruoyi 登录用户模型（务必带上 userId & deptId）
            LoginUser loginUser = new LoginUser(user.getUserId(), user.getDeptId(), user, null); // 第二个参数为用户权限列表，按需补充

            // 生成JWT Token（Ruoyi自带TokenService，自动处理过期时间）
            String token = tokenService.createToken(loginUser);

            // 组装返回结果（用户信息+Token，前端需存储Token用于后续请求）
            Map<String, Object> resultMap = CollectionUtils.newHashMap();
            resultMap.put("userId", user.getUserId());     // 用户ID
            resultMap.put("username", user.getUserName()); // 用户名
            resultMap.put("token", token);                 // 登录Token（核心，维持登录状态）
            resultMap.put("tokenHead", "Bearer ");         // Token头部（Ruoyi默认规范，前端请求头需带此前缀）

            return AjaxResult.success("人脸登录成功", resultMap);
        } catch (Exception e) {
            return AjaxResult.error("人脸登录失败: " + e.getMessage());
        }
    }

    /**
     * 人脸注册请求参数封装（Lombok的@Data自动生成getter/setter）
     */
    @Data
    static class FaceRegisterRequest {
        private String username;    // 用户名（需与系统用户表用户名一致）
        private String phone;       // 手机号（用于身份校验，可选）
        private String faceImage;   // Base64编码的人脸图片（前端需将图片转为Base64传输）
    }

    /**
     * 人脸登录请求参数封装
     */
    @Data
    static class FaceLoginRequest {
        private String faceImage;   // Base64编码的人脸图片（格式：，需确保前端正确截取Base64部分）
    }
}